/// leastSquaresFit
/// Calculate the least square fit linear regression of provided values
/// @param {map} $map - A Sass map of viewport width and size value combinations
/// @return Linear equation as a calc() function
/// @example
///   $map: (576: 24, 768: 24, 992: 34)
///   font-size: leastSquaresFit($map)
/// @author Jake Wilson <jake.e.wilson@gmail.com>
@function leastSquaresFit($map) {
    // Get the number of provided breakpoints
    $length: length(map-keys($map));
    // Error if the number of breakpoints is < 2
    @if ($length < 2) {
        @error "leastSquaresFit() $map must be at least 2 values"
    }
    // Calculate the Means
    $resTotal: 0;
    $valueTotal: 0;
    @each $res,
    $value in $map {
        $resTotal: $resTotal + $res;
        $valueTotal: $valueTotal + $value;
    }
    $resMean: $resTotal / $length;
    $valueMean: $valueTotal / $length;
    // Calculate some other stuff
    $multipliedDiff: 0;
    $squaredDiff: 0;
    @each $res,
    $value in $map {
        // Differences from means
        $resDiff: $res - $resMean;
        $valueDiff: $value - $valueMean;
        // Sum of multiplied differences
        $multipliedDiff: $multipliedDiff + ($resDiff * $valueDiff);
        // Sum of squared resolution differences
        $squaredDiff: $squaredDiff + ($resDiff * $resDiff);
    }
    // Calculate the Slope
    $m: $multipliedDiff / $squaredDiff;
    // Calculate the Y-Intercept
    $b: $valueMean - ($m * $resMean);
    // Return the CSS calc equation
    @return calc(#{$m * 100}vw + #{$b}px);
}